#pragma once
#include <functional>
#include "Reactor.hpp"
#include "Socket.hpp"
using namespace mySocket;


using handler_conn_t = std::function<std::string(std::string&)>;

class Reactor;


//我们今天对于所有的监听套接字也好，普通套接字也好，都把他看成一个Connection!
class Connection{
public:
    Connection(){}
    ~Connection(){}

    //下面这里需要注意的是：
    //因为我们今天想要把listensockfd和sockfd当成同一种东西来看，只是在一些方面上实现的不同！
    //所以，这里就实现这个虚基类，只实现方法！ 分别用Listener来表示监听套接字，Channel来表示普通的套接字

    //下面这些方法，对于监听套接字来讲，可能只用得到读取事件！所以自行选择对应得功能进行重写即可！
    //处理读取的虚方法
    virtual void Recver() = 0;

    //处理写入的虚方法
    virtual void Sender() = 0;

    //处理异常事件的虚方法
    virtual void Excepter() = 0;

    //获取文件描述符
    virtual int GetSockFd() = 0;

    virtual uint16_t Getport() {return 0;}

    //获取关注事件(不管是哪一种fd，都放在基类上！)
    uint32_t GetEvents(){return _events;}
    //设置关注事件
    void SetEvents(uint32_t events){_events = events;}

    //回调指针，方便基类通过这个回调指针来进行Reactor内的操作！
    void SetReactBackPtr(Reactor* react){_react = react;}
    Reactor* GetReactBackPtr(){return _react;}

    //注册每个连接应该做的服务
    void RegsiterHandler(handler_conn_t handler){_handler_conn = handler;}
private:
    //关心的事件
    uint32_t _events;


    //回调指针  因为连接类可能会用到Reactor上的接口
    //比如listener用到上层的AddConnection，把新连接加入到内核 + 哈希中
    //所以，需要有这么一个回调指针
    Reactor* _react;
protected:
    handler_conn_t _handler_conn;
};


